object TestQuery {
    @JvmStatic
    fun main(args: Array<String>) {
//        val druid = DruidDataSource()
//        druid.apply {
//            username = "root"
//            password = "123456"
//            url =
//                "jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai"
//            driverClassName = "com.mysql.jdbc.Driver"
//        }
//        val db = DBConnection(druid, DB.MYSQL)
//
//        val druidPg = DruidDataSource()
//        druidPg.apply {
//            username = "postgres"
//            password = "123456"
//            url =
//                "jdbc:postgresql://localhost:5432/postgres"
//            driverClassName = "org.postgresql.Driver"
//        }
//        val dbPg = DBConnection(druidPg, DB.PGSQL)

//        val select = db select User.id / 1 from User
//        println(select)

//        val select = db.select().from(User)
//        select.query<User>()

//        val select = db select User.id from User where ((User.name eq "name") or (User.id eq 1))

//        val select = db
//            .select()
//            .from(User)
//            .where(User.gender inList listOf(1, 2))
//            .where(User.id between 1 and 10)
//            .where(User.name.isNotNull())
//            .where(User.name like "%xxx%")

//        val user = User(name = "小黑", gender = 1)
//        val insert = db insert User value user
//        insert.exec()

//        val user = mutableMapOf<String, Any>("user_name" to "小黑", "gender" to 1)
//        val insert = db insert "user" value user
//        insert.exec()

//        val id: Long? = null // 假设此处为用户传参
//        val update = db update User set listOf(User.name to "小白", User.gender to 2)
//        update.where({ id != null }, User.id eq id)
//        update.exec()

//        val incr = db update User incr User.id
//        println(incr)

//        val delete = db delete User where (User.id eq 1)
//        delete.exec()

//        val truncate = db truncate User
//        truncate.exec()

//        val createTable = db createTable "user_copy" columns {
//            add(column("id").dataType("INT(10)").primary())
//            add(column("user_name").dataType("VARCHAR(50)").notNull())
//            add(column("gender").dataType("TINYINT(1)"))
//        }
//        createTable.exec()

//        val createIndex = db createUniqueIndex "index_name" on "table_name"
//        createIndex.exec()

//        val dropTable = db dropTable "table_name"

//        val dropIndex = db dropIndex "index_name" on "table_name"

//        val select = db select allColumn() from User where (User.id gt 1) orderByAsc User.name limit 10 offset 100

//        val alias = db
//            .select("u.id" alias "c1", column("u.name") alias "c2")
//            .from(User)
//            .alias("u")
//
//        println(alias)

//        val select = db
//            .select(User.id alias "c1", User.name alias "c2")
//            .from(User)
//            .where(User.id eq 1)
//            .orderByAsc(User.name)
//            .limit(10, 100)

//        val agg = db select count() from User groupBy User.gender

//        val distinct = db.select().distinct().from(User)

//        val case = db
//            .select(case(User.gender eq 1 then "男", User.gender eq 2 then "女") elseIs "其他" alias "gender")
//            .from(User)

//        val case = case(User.gender eq 1 then User.gender) elseIs null
//        val select = db
//            .select(count(case) alias "male_count")
//            .from(User)

//        val join = db
//            .select()
//            .from(User)
//            .leftJoin(Post)
//            .on(User.id eq Post.uid)

//        val subQuery = db.select().from(select().from(User))

//        val subQuery = db
//            .select()
//            .from("t1")
//            .leftJoin(select().from("t2").limit(10))
//            .alias("t2")
//            .on(column("t1.id") eq column("t2.id"))

//        val subQuery = db
//            .select()
//            .from(User)
//            .where(User.id inList select(User.id).from(User).limit(10))

//        val union = db select User.name from User where (User.id eq 1) union
//                (select(User.name) from User where (User.id eq 2)) unionAll
//                (select(User.name) from User where (User.id eq 3))

//        val over = db select (rank().over() partitionBy User.id orderByAsc User.name orderByDesc User.gender alias "over") from User

//        val select = db select User.id from User
//        select.queryMap()

//        val nativeSelect = db.nativeSelect("select * from user").queryMap()

//        val transaction = db.transaction {
//            update(User).set(User.name to "xxx").where(User.id eq 1).exec()
//
//            val update = this update User set (User.name to "xxx") where (User.id eq 2)
//            update.exec()
//
//            throw SQLException()
//        }

//        val subQuery = db
//            .select()
//            .from(User)
//            .where(User.id inList Select().select(User.id).from(User).limit(10))


//        val select = Select().select().from(User).orderBy(listOf(User.id.asc(), User.name.desc(), column("a").asc()))

//        val user = User(5, "熊大")

//        db.update(user)
//
//        db.update { update(User).set(User.name to "光头强").where(User.id eq 1) }
//
//        db.update(User).set(User.name to "光头强").where(User.id eq 1).exec()

//        db.insert { into(User).value(user) }

//        val user = db.find<User>(2)
//        println(user)

//        val users = db.nativeSelect("select * from user where name = ?", "小白").query<User>()
//        println(users)

//        val select = db select User.allColumn() from User where (User.name like "%xxx%") orderBy User.id.asc()

//        val select = db select allColumn() from User leftJoin Post on (User.id eq Post.uid) where (Post.name like "%xxx%") orderBy User.name.asc()

//        val with = db.with().recursive()
//            .add("query1", Select().select("id", "name").from(User), "id", "name")
//            .select {
//                select().from("query1") union Select().select().from("query1")
//            }
//        println(with.sql())
//        println(with.queryMap())

//        val insert = db
//            .insert("user")
//            .columns("name")
//            .select {
//                select(User.name).from(User)
//            }
//
//        val a = insert.execReturnKey()
//        println(a)
//        println(insert)

//        val users = listOf<MutableMap<String, Any?>>(mutableMapOf("name" to "xxx"), mutableMapOf("name" to "yyy"))
//        val insert = db.insert("user").values(users)
//        insert.exec()


//        db.page<User>(10, 2)
//        db.fetchCount<User>()
//        db.queryAll<User>()
//
//        db.transaction {
//            val users = page<User>(10, 2)
//            println(users)
//        }
//
//        val users = db.page<User>(10, 2)
//        println(users)
//
//        println(db.fetchCount<User>())

//        println(db.queryAll<User>())

//        firstPage<User>(User.id.asc(), 10)
//        nextPage<User>(User.id.asc(), 100, 10)
//        previousPage<User>(User.id.asc(), 100, 10)
//        lastPage<User>(User.id.asc(), 10)

//        val select = db.select().from(User)
//        println(select.firstPage<User>(User.id.asc(), 10))
//        println(select.nextPage<User>(User.id.asc(), 11, 10))
//        println(select.lastPage<User>(User.id.asc(), 10))
//        println(select.previousPage<User>(User.id.asc(), 106, 10))

//        println(select.firstPage<User>(User.id.desc(), 10))
//        println(select.nextPage<User>(User.id.desc(), 106, 10))
//        println(select.lastPage<User>(User.id.desc(), 10))
//        println(select.previousPage<User>(User.id.desc(), 11, 10))

//        println(db.firstPage<User>(User.id.desc(), 10))
//        println(db.nextPage<User>(User.id.desc(), 106, 10))
//        println(db.previousPage<User>(User.id.desc(), 105, 10))
//        db.lastPage<User>(User.id.asc(), 10)
//        db.previousPage<User>(User.id.asc(), 12, 10)
//        db.nextPage<User>(User.id.asc(), 11, 10)



//        val user = db.find<User>(7)!!
//        println(user)
//        user.name = "aaa"
//        db.save(user)
//        INSERT INTO "test" ("test"."id", "test"."name") VALUES (1, 'bbb') ON CONFLICT ("test"."id") DO UPDATE SET "test"."name" = EXCLUDED."name"

//        val select = db.select(User.id, User.name, User.dateTime).from(User).query<Triple<Long, String, Date>>()
//        val a = select[0].second
//
//        val select1 = db.select(User.id, User.name, User.dateTime).from(User).query(Triple::class.java)
//        val b = select1[0].second
//
//        val select2 = db.select(User.dateTime).from(User).query<Date?>()
//        println(select2)

//        dbPg.generateEntity("postgres", "src/test/java/entity/")
//        db.generateEntity("test", "src/test/java/entity/")
    }
}